﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
// 原题连接：https://leetcode.cn/problems/0H97ZC/
/*
题目描述：、
给定两个数组，arr1 和 arr2，

arr2 中的元素各不相同
arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序，使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

 

示例：

输入：arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出：[2,2,2,1,4,3,3,9,6,7,19]
 

提示：

1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中
*/

// 开始解题：

// 方法1——计数排序
int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize) {
    assert(arr1 && arr2 && returnSize);
    *returnSize = arr1Size;
    int* count = (int*)malloc(1001 * sizeof(int));
    if (NULL == count) {
        perror("malloc fail!\n");
        exit(-1);
    }
    memset(count, 0, 1001 * sizeof(int));
    int* answer = (int*)malloc(arr1Size * sizeof(int));
    if (NULL == answer) {
        perror("malloc fail!\n");
        exit(-1);
    }
    int i = 0;
    int j = 0;
    int k = 0;
    int n = 0;
    for (i = 0; i < arr1Size; i++) {
        count[arr1[i]]++;
    }
    // 先将arr2中的元素放到answer
    for (i = 0; i < arr2Size; i++) {
        for (j = 0; j < count[arr2[i]]; j++) {
            answer[n] = arr2[i];
            n++;
        }
        count[arr2[i]] = 0;
    }

    for (i = 0; i < 1001; i++) {
        if (count[i] != 0) {
            for (j = 0; j < count[i]; j++) {
                answer[n] = i;
                n++;
            }
        }
    }
    return answer;
}